@This is an ugly hack to get GNU AS to be nice to me
CSAPS_FILE_BEGIN:

@This file generates output when assembled which follows the format specified in the specification at

@Hextator's Doc/Development/Applications/Reformatting/Binary Reformatters/AP to Text

@in the archive

@http://dl.dropboxusercontent.com/u/336940/Software/Hextator%27s%20Doc/README.html

@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

@	Vars
.set				CSAPS_CURR_MAP_SHEET_ADDR, 0x0203FF20
.set				CSAPS_NEXT_MAP_SHEET_ADDR, 0x0203FF24
.set				CSAPS_CURR_OAM_SHEET_ADDR, 0x0203FF28
.set				CSAPS_NEXT_OAM_SHEET_ADDR, 0x0203FF2C

@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.set				CSAPS_MAP_PAL_LOAD_EVENT_HOOK_ORIGIN, 0x0800179C

@Address to check
.long				CSAPS_MAP_PAL_LOAD_EVENT_HOOK_ORIGIN
@Offset within file
.long				CSAPS_MPLE_HOOK_START

@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.set				CSAPS_OAM_LOAD_EVENT_HOOK_ORIGIN, 0x080032F0

.set				CSAPS_OAM_LOAD_EVENT_HOOK_SIZE, CSAPS_OLEH_END - CSAPS_OLEH_START
@Address to write to
.long				CSAPS_OAM_LOAD_EVENT_HOOK_ORIGIN
@Size
.long				CSAPS_OAM_LOAD_EVENT_HOOK_SIZE

@.org				CSAPS_OAM_LOAD_EVENT_HOOK_ORIGIN
				CSAPS_OLEH_START:
@Ugly hack mentioned above implemented here
.set				CSAPS_OLEH_OFFSET, CSAPS_FILE_BEGIN - CSAPS_OLEH_START
.set				CSAPS_OLEH_CORRECT, CSAPS_OAM_LOAD_EVENT_HOOK_ORIGIN + CSAPS_OLEH_OFFSET

.thumb

ldr 	r2,			CSAPS_OLEH_TARGET
bx	r2
				CSAPS_OLEH_TARGET:
.long				CSAPS_CORRECT + CSAPS_OLE + 1
				CSAPS_OLEH_END:

@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

@.set				CSAPS_MAP_PAL_LOAD_EVENT_HOOK_ORIGIN, 0x0800179C

.set				CSAPS_MPLE_HOOK_SIZE, CSAPS_MPLE_HOOK_END - CSAPS_MPLE_HOOK_START
@Address to write to
.long				CSAPS_MAP_PAL_LOAD_EVENT_HOOK_ORIGIN
@Size
.long				CSAPS_MPLE_HOOK_SIZE

@.org				CSAPS_MAP_PAL_LOAD_EVENT_HOOK_ORIGIN
				CSAPS_MPLE_HOOK_START:
@Ugly hack mentioned above implemented here
.set				CSAPS_MPLEH_OFFSET, CSAPS_FILE_BEGIN - CSAPS_MPLE_HOOK_START
.set				CSAPS_MPLEH_CORRECT, CSAPS_MAP_PAL_LOAD_EVENT_HOOK_ORIGIN + CSAPS_MPLEH_OFFSET

.thumb

ldr	r0,			CSAPS_MPLEH_TARGET
bx	r0
				CSAPS_MPLEH_TARGET:
.long				CSAPS_CORRECT + CSAPS_MPLE + 1
				CSAPS_MPLE_HOOK_END:

@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.set				CSAPS_ORIGIN, 0x080CB680
.set				CSAPS_SIZE, CSAPS_ENDING - CSAPS_BEGINNING
@Address to write to
.long				CSAPS_ORIGIN
@Size
.long				CSAPS_SIZE

@Important note: there are three symbols at the bottom of the code that are for reference,
@but not actually needed by the code; it is recommended that their values be displayed/obtained
@and updated accordingly in "CSA Corrections.txt" for easier reference

@				csaProcessor:
@.org				CSAPS_ORIGIN
				CSAPS_BEGINNING:
@Ugly hack mentioned above implemented here
.set				CSAPS_OFFSET, CSAPS_FILE_BEGIN - CSAPS_BEGINNING
.set				CSAPS_CORRECT, CSAPS_ORIGIN + CSAPS_OFFSET

.thumb

@				@
@	Callback code		@
@				@

.long				0x00000019
.long				0x00000000
.long				0x00000003
.long				CSAPS_CORRECT + Processor + 1
.long				0x00000000
.long				0x00000000

@				@
@	Constructor code	@
@				@

@				@Constructor; tested and working
				Dim_Constructor:
push	{r4-r6, lr}		@
mov	r5,	r0		@
mov	r0,	#0x1		@
push	{r0}			@
				From_No_Dim_Constructor:
ldr	r0,	[r7,	#0x38]	@
bl				0x08054678 - CSAPS_CORRECT
@				@r0 is now the boolean "isLeftToRight"
mov	r6,	r0		@now r6 is
mov	r0,	r5		@
bl				0x0804FFF0 - CSAPS_CORRECT
bl				0x08050008 - CSAPS_CORRECT
ldr	r0,			ProcessStreamLoc
mov	r1,	#0x3		@
bl				0x08004494 - CSAPS_CORRECT
mov	r4,	r0		@
str	r5,	[r4,	#0x5C]	@
mov	r0,	#0x0		@
strh	r0,	[r4,	#0x2C]	@
mov	r0,	r5		@
bl				0x08054804 - CSAPS_CORRECT
lsl	r0,	r0,	#0x10	@
asr	r0,	r0,	#0x10	@
bl				0x0805468C - CSAPS_CORRECT
add	r4,	#0x29		@
strb	r0,	[r4]		@
eor	r0,	r6		@r0 is now the corrected boolean "isLeftToRight"
ldr	r1,			SPELL_ID_PTR
cmp	r0,	#0x0		@Fix pointer to use spell ID of left unit if
				@animation is going from left to right
beq				NO_SUB
sub	r1,	#0x2		@
				NO_SUB:
ldrb	r1,	[r1]		@
lsl	r5,	r0,	#0x2	@r5 is now variable animation data offset
lsl	r1,	r1,	#0x2	@
lsl	r6,	r1,	#0x2	@
add	r1,	r1,	r6	@r1 now equals AnimationDataBase offset
ldr	r6,			AnimationDataBase
add	r6,	r1,	r6	@r6 now points to animation data struct
cmp	r0,	#0x0		@
beq				R_T_L
mov	r0,	#0x44		@
b				L_T_R
				R_T_L:
mov	r0,	#0xAC		@
				L_T_R:
ldr	r4,			LOW_DUMMY_FRAME_DATA
add	r4,	#0x2C		@
strb	r0,	[r4,	#0x02]	@Low dummy AIS's X offset is set
add	r4,	#0x48		@
strb	r0,	[r4,	#0x02]	@High dummy AIS's X offset is set
sub	r4,	#0x74		@
mov	r0,	#0x80		@
lsl	r0,	r0,	#0x18	@
str	r0,	[r4,	#0x0C]	@
str	r0,	[r4,	#0x1C]	@Both instances of dummy frame data are now terminated
ldr	r4,			FRAME_DATA_STREAM_PTR
ldr	r0,	[r6]		@
str	r0,	[r4]		@
add	r5,	#0x4		@
ldr	r0,	[r6,	r5]	@
sub	r4,	#0x54		@
str	r0,	[r4,	#0x30]	@High dummy AIS's base OAM pointer set
mov	r0,	#0x38		@
strb	r0,	[r4,	#0x0A]	@High dummy AIS's priority value set
add	r5,	#0x8		@
ldr	r0,	[r6,	r5]	@
sub	r4,	#0x48		@
str	r0,	[r4,	#0x30]	@Low dummy AIS's base OAM pointer set
mov	r0,	#0xFF		@
strb	r0,	[r4,	#0x0A]	@Low dummy AIS's priority value set
ldr	r4,			CON_MAP_1_MAP_DATA_CACHE_1
sub	r5,	#0xC		@
lsl	r5,	#0x8		@r5 = H flip bit for map data; r4 = MapBase
mov	r0,	#0x11		@
lsl	r0,	r0,	#0x8	@r0 is selecting the top left tile of the sheet
orr	r0,	r5		@r0 is correctly flipping the tiles
mov	r6,	#0x1		@
lsl	r6,	#0x9		@Loop size
add	r3,	r4,	r6	@r3 = End of map data
cmp	r5,	#0x0		@
bne				L_T_R_MAP_DATA
				MAP_DATA_LOOP_1:
strh	r0,	[r4]		@
add	r0,	#0x1		@
add	r4,	#0x2		@
cmp	r4,	r3		@
bne				MAP_DATA_LOOP_1
				@Map data set
b				MAP_DATA_COMPLETE
				L_T_R_MAP_DATA:
sub	r0,	#0x20		@
				L_T_R_MAP_DATA_LOOP:
mov	r5,	#0x20		@
add	r0,	r0,	r5	@
				MAP_DATA_LOOP_2:
sub	r5,	#0x1		@
add	r2,	r0,	r5	@
sub	r2,	#0x2		@
strh	r2,	[r4]		@
add	r4,	#0x2		@
cmp	r5,	#0x0		@
bne				MAP_DATA_LOOP_2
cmp	r4,	r3		@
bne				L_T_R_MAP_DATA_LOOP
				MAP_DATA_COMPLETE:

@	Zero fill map layer sheet

push	{r0-r7}			@Not sure if this is necessary
ldr	r1,			CSAPS_INIT_BG_SHEET_PTR_1
mov	r0,	#0x00		@Zero fill
strh	r0,	[r1]		@Set fill value
mov	r0,	r1		@Set source address
mov	r2,	#0x1		@Set fill bit
lsl	r2,	r2,	#0x13	@
add	r2,	#0x80		@Set word count
lsl	r2,	r2,	#0x5	@Finish shifting
swi	#0x0B			@CpuSet
b				CSAPS_MAP_SHEET_ZERO_DONE
				CSAPS_INIT_BG_SHEET_PTR_1:
.long				0x06002000
				CSAPS_MAP_SHEET_ZERO_DONE:
pop	{r0-r7}			@

ldr	r4,			IODataBase
mov	r0,	#0x18		@
strb	r0,	[r4,	#0x04]	@H-Blank set (part 1)
mov	r4,	#0x4		@
lsl	r4,	r4,	#0x10	@
add	r4,	#0x2		@
lsl	r4,	r4,	#0x8	@
ldrh	r0,	[r4]		@
mov	r1,	#0x2		@
orr	r0,	r1		@
strh	r0,	[r4]		@H-Blank set (part 2)
ldr	r0,			H_BLANK_BS
ldr	r1,			SCREEN_STRETCH_PC
str	r1,	[r0]		@Screen stretching IRQ set
pop	{r0}			@
cmp	r0,	#0x0		@
bne				super_with_dim
b				super_without_dim
				No_Dim_Constructor:
push	{r4-r6, lr}		@
mov	r5,	r0		@
mov	r0,	#0x0		@
push	{r0}			@
b				From_No_Dim_Constructor
.align				2
				LOW_DUMMY_FRAME_DATA:
.long				0x0203FF34
				@This constant is shared with a later routine
@				FRAME_DATA_STREAM_PTR:
@.long				0x0203FFFC
				ProcessStreamLoc:
.long				CSAPS_ORIGIN
				SPELL_ID_PTR:
.long				0x0203E026
				AnimationDataBase:
.long				0x08000000
				CON_MAP_1_MAP_DATA_CACHE_1:
.long				0x0203FC00
				IODataBase:
.long				0x03002870
				H_BLANK_BS:
.long				0x030028E4
				SCREEN_STRETCH_PC:
.long				CSAPS_CORRECT + H_BLANK_HANDLER + 1
				STRETCH_SPEC_PTR:
.long				0x0201FDB0

				super_with_dim:
bl				0x0804FB6C - CSAPS_CORRECT
				super_without_dim:
pop	{r4-r6}			@
pop	{r0}			@
bx	r0			@
.align				2

@				@
@	H Blank code		@
@				@

				H_BLANK_HANDLER:
mov	r0,	#0x4		@
lsl	r0,	r0,	#0x18	@r0 = IO base address
ldrh	r1,	[r0,	#0x04]	@
mov	r2,	#0x1		@
and	r2,	r1		@
cmp	r2,	#0x0		@
bne				NO_UPDATE_SCANLINE
ldrh	r1,	[r0,	#0x06]	@
lsr	r2,	r1,	#0x1	@
neg	r2,	r2		@
strh	r2,	[r0,	#0x16]	@
				NO_UPDATE_SCANLINE:
bx	lr

@				@
@	Processor code		@
@				@

				Processor:
				@Processor; tested and working
				@processAnimation:
.thumb
push	{r0-r7, lr}		@
mov	r4,	r0		@r4 points to "this spell"
ldr	r0,	[r4,	#0x5C]	@Loads pointer to AIS for unit casting this spell
mov	r6,	r0		@Attacker's AIS ref'd by r6
bl				0x080547A8 - CSAPS_CORRECT
add	r5,	r0,	#0x0	@Puts returned pointer to target unit's AIS into r5
ldr	r7,			FRAME_DATA_STREAM_PTR
				@
				@Begin coding here

ldr	r3,	[r7]		@r3 points to frame data
ldr	r0,	[r3]		@r0 is frame data
lsr	r1,	r0,	#0x18	@
cmp	r1,	#0x86		@
beq				FRAME_TYPE_86
cmp	r1,	#0x80		@
beq				TERMINATOR_PASS

					FRAME_TYPE_85:
	lsl	r1,	r0,	#0x18	@
	lsr	r1,	r1,	#0x18	@
	cmp	r1,	#0x1F		@
	beq				COMMAND_1F
	cmp	r1,	#0x29		@
	beq				COMMAND_29
	cmp	r1,	#0x2A		@
	beq				COMMAND_2A
	cmp	r1,	#0x40		@
	beq				COMMAND_40
	cmp	r1,	#0x48		@
	beq				COMMAND_48
	cmp	r1,	#0x1A		@
	beq				COMMAND_1A
	cmp	r1,	#0x08		@
	bne				COMMAND_DEFAULT

						COMMAND_08:
						COMMAND_1A:
		mov	r2,	#0x9		@
		ldrh	r0,	[r5,	#0x10]	@Load target's status flags
		orr	r2,	r0		@Set "hit" flags that were immediately loaded
		strh	r2,	[r5,	#0x10]	@Update status flags
		mov	r3,	r1		@
		add	r4,	#0x29		@
		ldrb	r1,	[r4]		@
		mov	r0,	r5		@
		cmp	r3,	#0x1A		@If we hit without using 0x1A, steal HP
		bne				Steal_HP
		bl				0x08050140 - CSAPS_CORRECT
		b				COMMAND_COMPLETE
						Steal_HP:
		bl				0x080502EC - CSAPS_CORRECT

		b				COMMAND_COMPLETE

						COMMAND_1F:
		add	r4,	#0x29		@
		ldrb	r1,	[r4]		@
		cmp	r1,	#0x0		@Only play hit sound if hitting
		bne				COMMAND_COMPLETE
		mov	r0,	r5		@
		bl				0x08067D14 - CSAPS_CORRECT
		b				COMMAND_COMPLETE

						COMMAND_29:
		ldr	r6,			LCD_IO_SOURCE
		mov	r2,	#0x3F		@
		mov	r1,	#0x34		@
		strb	r2,	[r6,	r1]	@Enable special color effects
		mov	r1,	#0x3C		@
		lsl	r2,	r1,	#0x8	@
		add	r2,	#0x42		@
		strh	r2,	[r6,	r1]	@LOL optimization; enable alpha blending
		add	r1,	#0x9		@
		lsr	r2,	r0,	#0x8	@
		strb	r2,	[r6,	r1]	@Set transparency
		sub	r1,	#0x1		@
		lsr	r2,	r2,	#0x8	@
		strb	r2,	[r6,	r1]	@Set brightness
		b				COMMAND_COMPLETE

						COMMAND_2A:
		ldr	r6,			LCD_IO_SOURCE
		lsl	r2,	r0,	#0x10	@
		lsr	r2,	r2,	#0x18	@
		mov	r1,	#0x1F		@Show map2/map3
		cmp	r2,	#0x0		@
		bne				DRAW_MAPS_2_AND_3	
		mov	r1,	#0x13		@Or you know, don't
						DRAW_MAPS_2_AND_3:
		strb	r1,	[r6,	#0x1]	@
		b				COMMAND_COMPLETE

						COMMAND_40:
		mov	r0,	r6		@
		mov	r1,	#0x1		@
		neg	r1,	r1		@
		bl				0x0804E498 - CSAPS_CORRECT
		b				COMMAND_COMPLETE

						COMMAND_48:
		lsl	r0,	r0,	#0x8	@
		lsr	r0,	r0,	#0x10	@r0 = music ID to play
		mov	r1,	#0x80		@
		ldrh	r2,	[r5,	#0x2]	@
		mov	r3,	#0x2		@
		bl				0x080681E4 - CSAPS_CORRECT
		b				COMMAND_COMPLETE

						COMMAND_DEFAULT:
		cmp	r1,	#0x13		@
		ble				COMMAND_COMPLETE
		strb	r1,	[r6,	#0x15]	@Send command value
		ldrh	r0,	[r6,	#0x06]	@
		add	r0,	#0x1		@
		strh	r0,	[r6,	#0x06]	@Increment delay countdown to ensure it is over 0
		mov	r1,	#0x1		@
		neg	r1,	r1		@
		lsr	r1,	r1,	#0x14	@r1 = 0x00000FFF
		ldrh	r0,	[r6,	#0x0C]	@
		and	r0,	r1		@Clear top bits of the +0x0C flags
		add	r1,	#0x1		@r1 = 0x00001000
		add	r0,	r0,	r1	@And set the bit for using commands
		strh	r0,	[r6,	#0x0C]	@Update +0x0C flags
		mov	r1,	#0x1		@
		strb	r1,	[r6,	#0x14]	@Fire command processing request

					COMMAND_COMPLETE:
	ldr	r3,	[r7]		@
	add	r3,	#0x4		@
	str	r3,	[r7]		@
					COMMAND_ESCAPE:
	b				Exit
					TERMINATOR_PASS:
	b				FRAME_TYPE_80

					FRAME_TYPE_86:
	ldrh	r2,	[r4,	#0x2C]	@FrameID--
	sub	r2,	#0x1		@FrameID--
	strh	r2,	[r4,	#0x2C]	@FrameID--
	mov	r3,	#0x0		@
	cmp	r2,	#0x0		@For checking if frame delay is == 0
	bgt				NO_ADVANCE
	beq				ADVANCE
	strh	r0,	[r4,	#0x2C]	@Update frame ID
	b				NO_ADVANCE
					ADVANCE:
	mov	r3,	#0x1		@
					NO_ADVANCE:
	push	{r3}			@r3 is boolean of whether to advance in frame data stream

	mov	r4,	r7		@
	sub	r4,	#0xC8		@r4 = LOW_DUMMY_FRAME_DATA
	str	r0,	[r4]		@
	str	r0,	[r4,	#0x10]	@

	@	Load top map data from cache

	ldr	r0,			MAP_1_MAP_DATA_CACHE_1
	ldr	r1,			MAP_1_MAP_DATA_BASE_1
	mov	r2,	#0x80		@128 words in the map data
	lsl	r2,	r2,	#0x1	@256 halfwords, though; writing to VRAM
	swi	#0x0B			@CpuSet

	@	Sprite sheet

	ldr	r3,	[r7]		@
	ldr	r0,	[r3,	#0x04]	@Get OAM sheet pointer
	ldr	r1,			OAM_SHEET_PTR
	str	r0,	[r4,	#0x04]	@
	str	r0,	[r4,	#0x14]	@
	cmp	r0,	#0x0		@Check if it's null
	bne				VALID_OAM_SHEET
	strh	r0,	[r1]		@Set fill value
	mov	r0,	r1		@Set source address
	mov	r2,	#0x1		@Set fill bit
	lsl	r2,	r2,	#0x13	@
	add	r2,	#0x40		@Set word count
	lsl	r2,	r2,	#0x5	@Finish shifting
	swi	#0x0B			@CpuSet
	b				INVALID_OAM_SHEET
					VALID_OAM_SHEET:
	
	@	Queue OAM sheet so that it is loaded
	@	asynchronously along with the OA data itself

	@	Not doing this here anymore
	@swi	#0x12			@LZ77UnCompVram

	ldr	r1,			CSAPS_QUEUE_NEXT_SHEET_REF
	str	r0,	[r1]		@Queue sheet

	b				INVALID_OAM_SHEET
	@				CSAPS_QUEUE_CURR_SHEET_REF:
	@.long				CSAPS_CURR_OAM_SHEET_ADDR
					CSAPS_QUEUE_NEXT_SHEET_REF:
	.long				CSAPS_NEXT_OAM_SHEET_ADDR
					INVALID_OAM_SHEET:

	@	Fill dummy AIS structs and set parent AIS pointer
	@	Also complete filling of dummy frame data

	ldr	r3,	[r7]		@
	ldr	r2,	[r3,	#0x08]	@r2 = OAM data offset
	ldr	r1,	[r3,	#0x0C]	@r1 = BG OAM data offset
	str	r1,	[r4,	#0x08]	@
	str	r2,	[r4,	#0x18]	@
	str	r4,	[r4,	#0x4C]	@Mind blowing optimization
	add	r4,	#0x10		@
	mov	r3,	r4		@
	add	r4,	#0x84		@
	str	r3,	[r4]		@
	mov	r4,	r3		@
	add	r4,	#0x10		@r4 = DEFAULT_OAM_PTR
	mov	r0,	#0x1		@
	strb	r0,	[r4]		@
	strb	r0,	[r4,	#0x0C]	@
	add	r4,	#0x54		@r4 = HI_DUMMY_AIS_PTR
	strb	r0,	[r4]		@+0x00 of dummy AISs set
	strb	r0,	[r4,	#0x06]	@
	sub	r4,	#0x48		@r4 = LOW_DUMMY_AIS_PTR
	strb	r0,	[r4,	#0x06]	@+0x06 of dummy AISs set
	add	r4,	#0x48		@r4 = HI_DUMMY_AIS_PTR
	ldrh	r0,	[r6,	#0x04]	@
	strh	r0,	[r4,	#0x04]	@
	sub	r4,	#0x48		@r4 = LOW_DUMMY_AIS_PTR
	strh	r0,	[r4,	#0x04]	@+0x04 of dummy AISs set
	mov	r0,	#0x28		@Sets palette/priority to use for sprites
	lsl	r0,	r0,	#0x8	@
	add	r0,	#0x40		@Sets tile base to use for sprites
	strh	r0,	[r4,	#0x08]	@
	add	r4,	#0x48		@r4 = HI_DUMMY_AIS_PTR
	mov	r0,	#0x24		@
	lsl	r0,	r0,	#0x8	@Higher priority because of nasty bugs involving
					@increasing priority the "correct" way
	add	r0,	#0x40		@
	strh	r0,	[r4,	#0x08]	@+0x08 of dummy AISs set
	sub	r4,	#0x48		@r4 = LOW_DUMMY_AIS_PTR
	mov	r0,	#0x0		@
	str	r5,	[r4,	#0x34]	@+0x34 of low dummy AIS set
	ldr	r0,	[r5,	#0x38]	@
	cmp	r0,	r4		@
	beq				SKIP_CHAIN_1
	str	r0,	[r4,	#0x38]	@+0x38 of low dummy AIS set; low AIS complete
	str	r4,	[r0,	#0x34]	@Low dummy AIS injected completely
					SKIP_CHAIN_1:
	str	r4,	[r5,	#0x38]	@Low dummy AIS is now child of defender
	add	r4,	#0x48		@r4 = HI_DUMMY_AIS_PTR
	ldr	r1,			PARENT_AIS_PTR
	ldr	r6,	[r1]		@
	ldr	r3,	[r6,	#0x38]	@
	str	r4,	[r6,	#0x38]	@Dummy is child of parent
	cmp	r3,	r4		@
	beq				SKIP_CHAIN_2
	str	r3,	[r4,	#0x38]	@Child is child of dummy
					SKIP_CHAIN_2:
	str	r6,	[r4,	#0x34]	@Parent is parent of dummy

	@	Sprite stuff handled; working with map layer

	ldr	r3,	[r7]		@
	ldr	r1,			BG_SHEET_PTR_1
	ldr	r0,	[r3,	#0x10]	@Get BG sheet pointer
	cmp	r0,	#0x0		@Check if it's null
	bne				VALID_BG_SHEET_1
	strh	r0,	[r1]		@Set fill value
	mov	r0,	r1		@Set source address
	mov	r2,	#0x1		@Set fill bit
	lsl	r2,	r2,	#0x13	@
	add	r2,	#0x80		@Set word count
	lsl	r2,	r2,	#0x5	@Finish shifting
	swi	#0x0B			@CpuSet
	b				INVALID_BG_SHEET_1
					VALID_BG_SHEET_1:
	
	@	Queue MAP sheet so that it is loaded
	@	asynchronously along with its palette

	@	Not doing this here anymore
	@swi	#0x12			@LZ77UnCompVram

	ldr	r1,			CSAPS_QUEUE_NEXT_MAP_SHEET_REF
	str	r0,	[r1]		@Queue sheet

	b				INVALID_BG_SHEET_1
	@				CSAPS_QUEUE_CURR_MAP_SHEET_REF:
	@.long				CSAPS_CURR_MAP_SHEET_ADDR
					CSAPS_QUEUE_NEXT_MAP_SHEET_REF:
	.long				CSAPS_NEXT_MAP_SHEET_ADDR
					INVALID_BG_SHEET_1:

	@	Queue map palette if it's not NULL

	ldr	r3,	[r7]		@
	ldr	r0,	[r3,	#0x18]	@r0 = BG palette pointer
	cmp	r0,	#0x0		@Check if it's null
	beq				NO_BG_PALETTE
	ldr	r1,			BG_PALETTE_ADDR
	mov	r2,	#0x8		@8 words in a palette
	swi	#0x0C			@CpuFastSet
	ldr	r3,	[r7]		@
					NO_BG_PALETTE:

	@	Queue OAM palette if it's not NULL

	ldr	r0,	[r3,	#0x14]	@r0 = OAM palette pointer
	cmp	r0,	#0x0		@Check if it's null
	beq				NO_OAM_PALETTE
	ldr	r1,			OAM_PALETTE_ADDR
	mov	r2,	#0x8		@8 words in a palette
	swi	#0x0C			@CpuFastSet
					NO_OAM_PALETTE:

	@	Handle frame advance

	pop	{r0}			@
	cmp	r0,	#0x0		@r0 is boolean of whether to advance to next frame
	beq				Exit
	ldr	r3,	[r7]		@
	add	r3,	#0x1C		@r3 = pointer to next frame
	str	r3,	[r7]		@Update frame data stream pointer
	b				Exit

					FRAME_TYPE_80:
	add	r3,	#0x4		@
	str	r3,	[r7]		@
	ldrh	r2,	[r4,	#0x2C]	@FrameID--
	sub	r2,	#0x1		@FrameID--
	bmi				NEGATIVE_DELAY
	strh	r2,	[r4,	#0x2C]	@FrameID--
					NEGATIVE_DELAY:
	cmp	r2,	#0x0		@For checking if frame delay is <= 0
	bgt				Exit
	lsl	r1,	r0,	#0x10	@
	lsr	r1,	r1,	#0x18	@
	cmp	r1,	#0x0		@
	beq				TERMINATE_ANIMATION
	add	r4,	#0x29		@
	ldrb	r1,	[r4]		@
	sub	r4,	#0x29		@
	cmp	r1,	#0x0		@
	beq				Exit
					TERMINATE_ANIMATION:
	mov	r2,	#0x0		@
	ldr	r1,			FRAME_DATA_STREAM_PTR
	sub	r1,	#0x9C		@
	strb	r2,	[r1]		@
	add	r1,	#0x48		@
	strb	r2,	[r1]		@Dummy AISs are disabled
	ldr	r0,			MAP_1_MAP_DATA_BASE_1
	mov	r1,	#0x0		@
	strh	r1,	[r0]		@
	mov	r1,	r0		@
	mov	r2,	#0x1		@
	lsl	r2,	r2,	#0x17	@
	add	r2,	#0x80		@
	lsl	r2,	r2,	#0x1	@
	swi	#0x0B			@CpuSet; clears map data
	ldr	r0,			LCD_IO_SOURCE
	mov	r1,	#0x8		@
	strb	r1,	[r0,	#0x4]	@Terminate H blank IRQ stuff (screen stretch)
	ldr	r0,			FRAME_DATA_STREAM_PTR
	sub	r0,	#0xA8		@r0 points to dummy OAM data
	mov	r1,	#0x1		@
	strb	r1,	[r0]		@
	str	r0,	[r0,	#0x48]	@OAM of low AIS dummy is terminated
	mov	r1,	#0x84		@
	str	r0,	[r0,	r1]	@OAM of high AIS dummy is terminated
	bl				0x0804FFFC - CSAPS_CORRECT
	bl				0x0804FBC4 - CSAPS_CORRECT
	add	r0,	r4,	#0x0	@
	bl				0x080046A0 - CSAPS_CORRECT

				Exit:
pop	{r0-r7}			@
pop	{pc}			@Hurf
.align				2
				FRAME_DATA_STREAM_PTR:
.long				0x0203FFFC
				MAP_1_MAP_DATA_CACHE_1:
.long				0x0203FC00
				MAP_1_MAP_DATA_BASE_1:
.long				0x06006800
				LCD_IO_SOURCE:
.long				0x03002870
				PARENT_AIS_PTR:
.long				0x02029C88
				OAM_SHEET_PTR:
.long				0x06010800
				BG_SHEET_PTR_1:
.long				0x06002000
				BG_PALETTE_ADDR:
.long				0x02022880
				OAM_PALETTE_ADDR:
.long				0x02022AA0

@				@
@	OAM Load Event code	@
@				@

				CSAPS_OLE:
@	Set return address as if this were called
ldr	r2,			CSAPS_OLE_RETURN
mov	lr,	r2		@

@	Replaced instructions
mov	r2,	r3		@
lsl	r3,	r2,	#0x1	@
lsl	r4,	r3,	#0xB	@
lsr	r2,	r4,	#0xB	@

push	{r0-r7}			@Why not

ldr	r2,			CSAPS_OLE_NEXT_SHEET_REF
ldr	r3,			CSAPS_OLE_CURR_SHEET_REF
ldr	r0,	[r2]		@
ldr	r1,	[r3]		@
cmp	r0,	r1		@
beq				CSAPS_OLE_NO_LOAD

str	r0,	[r3]		@ Update cache

@	Load OAM sheet
ldr	r1,			CSAPS_OLE_OAM_SHEET_PTR
swi	#0x12			@LZ77UnCompVram

				CSAPS_OLE_NO_LOAD:

pop	{r0-r7}			@
bx	lr			@Go home, FEditor. You're drunk.

.align				2
				CSAPS_OLE_RETURN:
.long				0x080032F8 + 1
				CSAPS_OLE_CONST_1:
.long				0x0300291C
				CSAPS_OLE_CURR_SHEET_REF:
.long				CSAPS_CURR_OAM_SHEET_ADDR
				CSAPS_OLE_NEXT_SHEET_REF:
.long				CSAPS_NEXT_OAM_SHEET_ADDR
				CSAPS_OLE_OAM_SHEET_PTR:
.long				0x06010800

@				@
@	Map Pal Load Event code	@
@				@

				CSAPS_MPLE:
@	Set return address as if this were called
ldr	r0,			CSAPS_MPLE_RETURN
mov	lr,	r0		@

@	Replaced instructions
ldr	r0,			CSAPS_MPLE_WRAM_PAL_BASE
mov	r1,	#0xA0		@
lsl	r1,	r1,	#0x13	@r1 = 0x05000000, map palette base
mov	r2,	#0x80		@
@	Not replaced, but loading palette here
@	since a timing issue seems to be fixed by loading the palette first
lsl	r2,	r2,	#0x1	@r2 = 256 halfwords, for 16 palettes of 16 halfword colours
swi	#0x0C			@CpuFastSet

push	{r0-r7}			@Dorp

ldr	r2,			CSAPS_MPLE_NEXT_SHEET_REF
ldr	r3,			CSAPS_MPLE_CURR_SHEET_REF
ldr	r0,	[r2]		@
ldr	r1,	[r3]		@
cmp	r0,	r1		@
beq				CSAPS_MPLE_NO_LOAD

str	r0,	[r3]		@ Update cache

@	Load OAM sheet
ldr	r1,			CSAPS_MPLE_MAP_SHEET_PTR
swi	#0x12			@LZ77UnCompVram

				CSAPS_MPLE_NO_LOAD:

pop	{r0-r7}			@
bx	lr			@Return to something more sane

.align				2
				CSAPS_MPLE_RETURN:
.long				0x08001804 + 1
				CSAPS_MPLE_WRAM_PAL_BASE:
.long				0x02022860
				CSAPS_MPLE_CURR_SHEET_REF:
.long				CSAPS_CURR_MAP_SHEET_ADDR
				CSAPS_MPLE_NEXT_SHEET_REF:
.long				CSAPS_NEXT_MAP_SHEET_ADDR
				CSAPS_MPLE_MAP_SHEET_PTR:
.long				0x06002000

				CSAPS_ENDING:

.set				DIM_CTOR_ADDR, CSAPS_CORRECT + Dim_Constructor + 1
.set				NO_DIM_CTOR_ADDR, CSAPS_CORRECT + No_Dim_Constructor + 1
.set				SPELL_ARRAY_ADDR, CSAPS_CORRECT + AnimationDataBase
